package cn.jianwoo.chatgpt.api.stream;

/**
 * @author gulihua
 * @Description
 * @date 2023-03-07 14:40
 */
import javax.net.ssl.*;
import java.security.KeyStore;
import java.security.SecureRandom;
import java.security.cert.X509Certificate;
import java.util.Arrays;

public class SSLSocketClient
{

    // 获取这个SSLSocketFactory
    public static SSLSocketFactory getSSLSocketFactory()
    {
        try
        {
            SSLContext sslContext = SSLContext.getInstance("SSL");
            sslContext.init(null, getTrustManager(), new SecureRandom());
            return sslContext.getSocketFactory();
        }
        catch (Exception e)
        {
            throw new RuntimeException(e);
        }
    }


    // 获取TrustManager
    private static TrustManager[] getTrustManager()
    {
        return new TrustManager[] { new X509TrustManager() {
            @Override
            public void checkClientTrusted(X509Certificate[] chain, String authType)
            {
            }


            @Override
            public void checkServerTrusted(X509Certificate[] chain, String authType)
            {
            }


            @Override
            public X509Certificate[] getAcceptedIssuers()
            {
                return new X509Certificate[] {};
            }
        } };
    }


    // 获取HostnameVerifier
    public static HostnameVerifier getHostnameVerifier()
    {
        return (s, sslSession) -> true;
    }


    public static X509TrustManager getX509TrustManager()
    {
        X509TrustManager trustManager = null;
        try
        {
            TrustManagerFactory trustManagerFactory = TrustManagerFactory
                    .getInstance(TrustManagerFactory.getDefaultAlgorithm());
            trustManagerFactory.init((KeyStore) null);
            TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();
            if (trustManagers.length != 1 || !(trustManagers[0] instanceof X509TrustManager))
            {
                throw new IllegalStateException("Unexpected default trust managers:" + Arrays.toString(trustManagers));
            }
            trustManager = (X509TrustManager) trustManagers[0];
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }

        return trustManager;
    }
}
